import { getToken, setToken, removeToken } from '@/utils/auth'
// 引入 登录 api 函数
import { login, getUserInfo } from '@/api/user'
// 导入静态路由表
import { constantRoutes, resetRouter } from '@/router'

export default {
  // 开启命名空间：开启以后，mutations action 才能注册到当前模块下
  namespaced: true,
  // 当前模块中的状态数据
  state: {
    // user模块初始化的时候，从本地存储中获取token，赋值给state.token
    // 如果获取不到（本地也没有token），那么就使用默认值null
    token: getToken() || null, /* 初始化的时候，从缓存中读取token */
    // 定义用户信息数据
    userinfo: {} // 控队做布尔判断的结果是 true
  },
  // mutations
  mutations: {
    // 定义一个修改token的mutation
    setToken(state, token) {
      // 把传过来的负载 token 作为新的token值，保存起来
      state.token = token
      // 原则：state中的token只要发送变化，就给本地存储写入最新的token
      // 在更新state.token的同时，向本地存储中写入新的token
      // 为什么写在这里？因为这里是唯一一个修改token 的地方
      setToken(token)
    },
    removeToken(state) {
      state.token = null
      // 当mutation中的removetoken被调用（commit）的时候，从本地存储中删除token
      removeToken()
    },
    // 定义一个mutation 函数，实现对 userinfo 的更新
    setUserInfo(state, userinfo) {
      state.userinfo = userinfo
    },
    setRoutes(state, regRoutes) {
      state.routes = [...constantRoutes, ...regRoutes]
    }
  },
  // actions
  actions: {
    // 定义处理登录的action
    async login(context, loginData) {
      // todo: 后续要调登录接口实现获取token
      // 调 user api 中的 login 函数，实现发送登录请求
      // 这个方法返回的是一个 Promise 对象
      // 要拿 Promise 中的数据，有两种方法：
      // 1. .then(数据)
      // 2. const 数据 = await login(loginData)
      const res = await login(loginData)
      // 思考：此时的 res 是什么
      // res 其实就是 token
      context.commit('setToken', res)
    },
    logout(context) {
      // 恢复在登录之前的状态
      // 1. token要删除
      context.commit('removeToken')
      // 2. userinfo 也要删除: 恢复到初始值
      context.commit('setUserInfo', {})
      // 3. 动态路由也要删除 ==> 为了左侧导航菜单的显示，真正控制路由的是 router 对象
      context.commit('setRoutes', [])
      // 如何清空 router 的路由
      // 4. 重置 router 对象中的路由表
      resetRouter()
    },
    async getUserInfo({ commit }) {
      // todo：调用获取用户资料的api接口，得到用户信息对象，然后更新到userindo上
      const res = await getUserInfo()
      // todo: 提交mutation，更新userinfo
      // const { commit } = context
      commit('setUserInfo', res)
    }
  }
}
